Asociace souboru s MDI aplikaci
Otázka od:  Jiri Foldyna
6. 10. 2004 11:33
Ahoj,
omlouvam se za asi neprilis vystizny subj, ale jde v podstate o toto:
Mam MDI aplikaci, ktera je asociovana z urcitym typem souboru. Po poklepani
na soubor napr. v pruzkumniku se spusti aplikace a otevre se okno se
souborem. Potreboval bych ale, aby se v pripade, ze aplikace uz bezi,
nespoustela dalsi instance, ale aby se v bezici aplikaci otevrelo dalsi
okno. Zjistit, jestli uz aplikace bezi, neni problem. Co potrebuji, je
predat bezici aplikaci nazev souboru. Jak to resite ?
Diky
Jiri Foldyna
Odpovedá:  Ing. Petr Sikola
6. 10. 2004 12:15
ja to delam pres message wm_copydata
kde si v aplikaci (jeste v *.dpr) zjistim jestli je jiz spustena jina
instance, a pokud ano, posilam mesage do te drive spustene, pokud ne,
nic neposilam.
v te drive spustene si wm_copydata odchytnu a prectu si z ni jmena
souboru.
Petr Sikola
> souborem. Potreboval bych ale, aby se v pripade, ze aplikace uz bezi,
> nespoustela dalsi instance, ale aby se v bezici aplikaci 
> otevrelo dalsi
> okno. Zjistit, jestli uz aplikace bezi, neni problem. Co potrebuji, je
> predat bezici aplikaci nazev souboru. Jak to resite ?
> Jiri Foldyna
Odpovedá:  Jan Rizek
6. 10. 2004 12:36
Tohle jsem nikdy neresil, ale slo by ho zapsat do souboru a z nej si to
precist.. (ShellChangeNotifier) .
> Ahoj,
>
> omlouvam se za asi neprilis vystizny subj, ale jde v podstate o toto:
>
> Mam MDI aplikaci, ktera je asociovana z urcitym typem souboru. Po
poklepani
> na soubor napr. v pruzkumniku se spusti aplikace a otevre se okno se
> souborem. Potreboval bych ale, aby se v pripade, ze aplikace uz bezi,
> nespoustela dalsi instance, ale aby se v bezici aplikaci otevrelo dalsi
> okno. Zjistit, jestli uz aplikace bezi, neni problem. Co potrebuji, je
> predat bezici aplikaci nazev souboru. Jak to resite ?
>
> Diky
>
> Jiri Foldyna
>
>
>
>
>
Odpovedá:  Ondrej Kelle
6. 10. 2004 12:17
> Mam MDI aplikaci, ktera je asociovana z urcitym typem 
> souboru. Po poklepani na soubor napr. v pruzkumniku
> se spusti aplikace a otevre se okno se souborem.
> Potreboval bych ale, aby se v pripade, ze aplikace uz
> bezi, nespoustela dalsi instance, ale aby se v bezici
> aplikaci otevrelo dalsi okno. Zjistit, jestli uz
> aplikace bezi, neni problem. Co potrebuji, je predat
> bezici aplikaci nazev souboru. Jak to resite ?
program MyApp;
uses
  Forms,
  JclAppInst,
  ...;
const
  MyAppUniqueID = ...; // napriklad GUID
begin
  with JclAppInstances(MyAppUniqueID) do
    if CheckInstance(1) then
    begin
      Application.Initialize;
      Application.Title := ...;
      Application.CreateForm(TMyAppMainForm, MyAppMainForm);
      Application.Run;
    end
    else
    begin
      SwitchTo(0);
      SendCmdLineParams('TMyAppMainForm', 0);
    end;
end.
HTH
TOndrej
Odpovedá:  Ondrej Kelle
6. 10. 2004 12:31
>> Mam MDI aplikaci, ktera je asociovana z urcitym typem 
>> souboru. Po poklepani na soubor napr. v pruzkumniku
>> se spusti aplikace a otevre se okno se souborem.
>> Potreboval bych ale, aby se v pripade, ze aplikace uz
>> bezi, nespoustela dalsi instance, ale aby se v bezici
>> aplikaci otevrelo dalsi okno. Zjistit, jestli uz
>> aplikace bezi, neni problem. Co potrebuji, je predat
>> bezici aplikaci nazev souboru. Jak to resite ?
Ospravedlnujem sa, moj predosly prispevok nebol uplny.
Ten kod v .dpr posle prvej instancii spravu WM_COPYDATA, takze v hlavnom
formulari aplikacie treba tuto spravu osetrit:
procedure TMyAppMainForm.WMCopyData(var Message: TWMCopyData);
var
  S: string;
  Strings: TStringList;
  I: Integer;
begin
  with Message do
    if (From = 0) and Assigned(CopyDataStruct) and (CopyDataStruct^.dwData =
AppInstCmdLineDataKind) and
      (CopyDataStruct^.cbData > 0) then
    begin
      Strings := TStringList.Create;
      try
        with CopyDataStruct^ do
          SetString(S, PChar(lpData), cbData);
        Strings.Text := S;
        for I := 0 to Strings.Count - 1 do
          OpenFile(Strings[I]);
      finally
        Strings.Free;
      end;
    end;
end;
OpenFile potom kontroluje, ci pre dane meno suboru uz existuje otvorene MDI
child okno; ak ano, len ho nastavi ho do popredia, inak vytvori nove okno.
HTH
TOndrej
Odpovedá:  Jiri Foldyna
6. 10. 2004 18:11
Diky vsem, vyzkousim.
Jiri Foldyna
> procedure TMyAppMainForm.WMCopyData(var Message: TWMCopyData);
> var
>   S: string;
>   Strings: TStringList;
>   I: Integer;
> begin
>   with Message do
>     if (From = 0) and Assigned(CopyDataStruct) and 
> (CopyDataStruct^.dwData =
> AppInstCmdLineDataKind) and
>       (CopyDataStruct^.cbData > 0) then
>     begin
>       Strings := TStringList.Create;
>       try
>         with CopyDataStruct^ do
>           SetString(S, PChar(lpData), cbData);
>         Strings.Text := S;
>         for I := 0 to Strings.Count - 1 do
>           OpenFile(Strings[I]);
>       finally
>         Strings.Free;
>       end;
>     end;
> end;
> 
> OpenFile potom kontroluje, ci pre dane meno suboru uz 
> existuje otvorene MDI
> child okno; ak ano, len ho nastavi ho do popredia, inak 
> vytvori nove okno.
> 
> HTH
> TOndrej
> 
> 
>